#include "compile_run.hpp"
using namespace compile_run;

#include "../comm/httplib.h"
using namespace httplib;
#include <string>

// in_json: {"code": include<>... , "input": , "cpu_limit": , "mem_limit": }
// out_json: {"status": , "reason": , "stdout": , "stderr": }

/**
 * 将cr模块打包成网络服务，并使用postman测试
 * 1.创建服务端
 * 2.提取请求正文
 * 3.调用cr
 * 4.构建响应正文:json串， application/json
 *
 */

// in_json: {"code": include<>... , "input": , "cpu_limit": , "mem_limit": }
// out_json: {"status": , "reason": , "stdout": , "stderr": }

void test()
{
    // Json::Value in_val;
    // Json::FastWriter _wr;

    // //     {
    // //     "code" : "#include <iostream>int main(){std::cout << \"Hello World, 你好，世界！！！\" << std::endl;}",
    // //     "input" : "",
    // //     "cpu_limit" : "2",
    // //     "mem_limit" : "1024 * 50"
    // // }

    // in_val["code"] = R"(
    // #include <iostream>
    // int main()
    // {
    //     std::cout << "Hello World, 你好，世界！！！" << std::endl;
    // })";
    // in_val["input"] = "";
    // in_val["cpu_limit"] = 2;
    // in_val["mem_limit"] = 1024 * 50;

    // std::string in_json = _wr.write(in_val);

    // // std::cout << "in_json: " << in_json << std::endl;

    // std::string out_json;

    // ComplieAndRun::Start(in_json, out_json);

    // std::cout << "out_json: " << std::endl;
    // std::cout << out_json;


    // Server svr;
    
    // svr.Post("/hello", [](const Request& rqt, Response& rsp)
    // {
    //     rsp.set_content("hello world, 你好, 世界！！！", "type/text;charset=utf8");
    // });

    // svr.listen("0.0.0.0", 8080);
}

void Usage()
{
    std::cout << "Please Enter 'port'" << std::endl;
    exit(-1);
}

int main(int args, char *argv[])
{

    //test();
    if (args != 2)
    {
        Usage();
    }

    // 服务端
    Server srv;

    // 注册处理Post请求的函数
    srv.Post("/compile_run", [](const Request &rqt, Response &rsp)
             {
                LOG(INFO) << "接收到编译运行请求" << std::endl;
                 // 提取请求正文
                 std::string in_json = rqt.body;
                 std::string out_json;

                 if (!in_json.empty())
                 {
                     // 调用cr模块
                     CompileAndRun::Start(in_json, out_json);
                     

                    std::cout << "运行完毕, json: " << std::endl << out_json << std::endl;
                    
                    //  LOG(INFO) << "cr完成,正在构建响应报文并回复..." << std::endl;
                     // 构建响应正文内容
                     rsp.set_content(out_json, "application/json;charset=utf-8");
                 }
                 else
                 {
                    LOG(ERROR) << "请求正文为空" << std::endl;
                    rsp.set_content("request is empty...", "text/plain;charset=utf8");
                 }
             });

    // srv.Get("/hello", [](const Request& req, Response& resp){
    //     LOG(INFO) << "/hello" << std::endl;
    //     resp.set_content("hello world", "text/plain;charset=utf-8");
    // });

    // 绑定ip and 端口号
    srv.listen("0.0.0.0", atoi(argv[1]));

    // Json::Value in_val;
    // in_val["code"] = R"(
    //     #include <iostream>
    //     using namespace std;
    //     int main()
    //     {
    //         std::cout << "Hello World" << std::endl;
    //         //int *p = new int[10240 * 1024];  //空间超限测试
    //         while(1); //时间超限测试
    //     }
    // )";
    // in_val["input"] = "";
    // in_val["cpu_limit"] = 2;
    // in_val["mem_limit"] = 10240 * 5;

    // Json::StyledWriter wr;
    // std::string in_json = wr.write(in_val);
    // std::cout << in_json << std::endl;

    // std::string out_json;
    // ComplieAndRun::Start(in_json, out_json);

    // std::cout << out_json << std::endl;

    // //测试compile模块
    // Compiler::Compile("hello");

    // //测试运行模块
    // Runner::Run("hello", 10, 102400);
}
